package com.itheima.mp.domain.po;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.itheima.mp.enums.UserStatus;
import lombok.Data;

import java.time.LocalDateTime;

@Data
// Lombok注解，自动生成getter、setter、toString、equals、hashCode等常用方法，减少样板代码。
@TableName(value = "tb_user",autoResultMap = true)
// MyBatis Plus注解，指定数据库表名为tb_user，并启用自动结果映射。
//- 描述：表名注解，标识实体类对应的表
//- 使用位置：实体类
//TableName注解除了指定表名以外，还可以指定很多其它属性
//原理
//1.表名映射：
//定义：@TableName 注解是 MyBatis Plus 提供的一个注解，用于将实体类与数据库表进行映射。
//作用：当实体类名与数据库表名不一致时，使用 @TableName 注解可以明确指定实体类对应的表名，从而避免手动编写 SQL 语句的繁琐工作。
//2.属性 value：
//功能：指定实体类对应的数据库表名。
//原理：value 属性接受一个字符串值，表示数据库中的表名。例如，value = "tb_user" 表示该实体类对应的数据库表名为 tb_user。
//3.属性 autoResultMap：
//功能：启用自动结果映射。
//原理：autoResultMap 属性设置为 true 时，MyBatis Plus 会自动构建一个 resultMap 并注入到 MyBatis 中，用于将查询结果映射到实体类的复杂类型字段。例如，如果实体类中有复杂类型字段（如 JSON 字段），MyBatis Plus 会自动处理这些字段的序列化和反序列化。
public class User {

    /**
     * 用户id
     */
    @TableId(type = IdType.AUTO)
    //- 描述：主键注解，标识实体类中的主键字段
    //- 使用位置：实体类的主键字段
    //IdType支持的类型比较常见的有三种：
    //- AUTO：利用数据库的id自增长
    //- INPUT：手动生成id
    //- ASSIGN_ID：雪花算法生成Long类型的全局唯一id，这是默认的ID策略
    private Long id;

    /**
     * 用户名
     */
    //@TableField("'username'")
    //描述：普通字段注解
    //一般情况下我们并不需要给字段添加@TableField注解，一些特殊情况除外：
    //- 成员变量名与数据库字段名不一致
    //- 成员变量是以isXXX命名，按照JavaBean的规范，MybatisPlus识别字段时会把is去除，这就导致与数据库不符。
    //- 成员变量名与数据库一致，但是与数据库的关键字冲突。使用@TableField注解给字段名添加转义字符：``
    private String username;

    /**
     * 密码
     */
    private String password;

    /**
     * 注册手机号
     */
    private String phone;

    /**
     * 详细信息
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    //该注解用于指定字段的类型处理器。在这个例子中，JacksonTypeHandler 被用来处理字段的序列化和反序列化。
    //具体来说，它将复杂类型（如自定义对象）转换为JSON字符串存储在数据库中，或者从数据库中的JSON字符串转换回复杂类型。
    //原理
    //1.类型处理器（TypeHandler）：
    //定义：类型处理器是MyBatis Plus中的一个接口，用于在Java类型和JDBC类型之间进行转换。
    //作用：当MyBatis Plus从数据库读取数据或将数据写入数据库时，类型处理器负责将数据从一种类型转换为另一种类型。
    //2.JacksonTypeHandler：
    //定义：JacksonTypeHandler 是MyBatis Plus提供的一个类型处理器，使用Jackson库进行JSON序列化和反序列化。
    //作用：它将Java对象转换为JSON字符串存储在数据库中，或者将数据库中的JSON字符串转换回Java对象。
    //3.序列化和反序列化：
    //序列化：将Java对象转换为JSON字符串。这个过程在将数据写入数据库时发生。
    //反序列化：将JSON字符串转换为Java对象。这个过程在从数据库读取数据时发生。
    private UserInfo info;

    /**
     * 使用状态（1正常 2冻结）
     */
    private UserStatus status;

    /**
     * 账户余额
     */
    private Integer balance;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;
}
